#ifndef FPLAYER_CHANNELMANAGER_H
#define FPLAYER_CHANNELMANAGER_H

#include "Channel.h"
#include <list>
#include "concurrent/Event.h"

/**
 * author: x-fan
 * date: 2024/1/17
 * desc: 通道管理
 */
class ChannelManager {
private:
  static ChannelManager *_pInstance;

  std::list<IChannel *> _ChannelList;
  Event _Event;

private:
  ChannelManager() = default;

public:
  virtual ~ChannelManager();

  /**
   * @return 创建ChannelManager的单例对象
   */
  static ChannelManager *Instance();

  /**
   * 销毁ChannelManager
   */
  static void Destroy();

  /**
   * 创建传输通道
   * @param channelType 通道类型
   * @return 返回传输通道
   */
  IChannel *createChannel(ChannelType channelType);

  /**
   * 销毁传输通道
   * @param pChannel 传输通道
   */
  void destroyChannel(IChannel *pChannel);

  /**
   * 根据通道类型获取传输通道
   * @param channelType 通道类型
   * @return 返回传输通道
   */
  IChannel *findChannel(ChannelType channelType);

  /**
   * 传输通道绑定采集对象
   * @param channelType 传输通道
   * @param pCapture 采集对象
   * @return true:成功
   */
  bool bindCapture(ChannelType channelType, ICapture *pCapture);

  /**
   * 传输通道解绑采集对象
   * @param channelType 传输通道
   * @param pCapture 采集对象
   */
  void unbindCapture(ChannelType channelType, ICapture *pCapture);

  /**
   * 传输通道绑定渲染对象
   * @param channelType 传输通道
   * @param pRender 渲染对象
   * @return true:成功
   */
  bool bindRender(ChannelType channelType, IRender *pRender);

  /**
   * 传输通道解绑渲染对象
   * @param channelType 传输通道
   * @param pRender 渲染对象
   */
  void unbindRender(ChannelType channelType, IRender *pRender);
};


#endif //FPLAYER_CHANNELMANAGER_H
